#define DLL_EXPORT
#include "Linifile.h"
#include <fstream>
struct keys{
    std::string key;
    std::string value;
} mykeyValue;

Linifile::Linifile(const char *file)
{ 
    //--构造生成ini文件
   std::ofstream inifle(file,std::ios::app);
    if(!inifle.is_open())
    {
        lastError="inifile creation failed !!";
           inifle.close();
        return;
    }
       inifle.close();
     _iniFileName=file;
}

Linifile::~Linifile()
{ //--析构
    if (str_data)
    {
        delete[]str_data;
        str_data = nullptr;
        std::cout<<"Linifile::~Linifile()"<<std::endl;
    }
}

bool Linifile::setinifile(const char *file)
{ // 与构造生成ini文件，相同
    std::ofstream inifle(file,std::ios::app);
    if(!inifle.is_open())
     {
       lastError="inifile creation failed !!"; 
          inifle.close();
       return false;
     }
      
        _iniFileName=file;
        inifle.close();
   return true;
}

bool Linifile::writeini(const char *root, const char *key, const char *value)
{
        std::string str_root=root;
        std::string str_key=key;
        std::string str_value=value;
        std::string data="["+str_root+"]";
        std::string keyValue=str_key+"="+value;
        getinidata(_iniFileName.c_str()); //获取ini全部内容,存入vector 返回记录数
        int indx=findRoot(data.c_str());//--找出root 并返回索引号0--->N;
        int startindx=indx;
      if(indx >-1) //--存在文件中   //--检查key value 是否存在。不存在就写入。
        {
         bool is_exist=false;
          while(1)
          {
             indx=indx+1;
             if(indx>inidata.size()-1) break; //超出记录退出
             if(inidata.at(indx).substr(0,1)=="[")
             {
                break; //--本区间结束退出
             }  
              getKey(inidata.at(indx).c_str()); //获取key 和 value
              if(mykeyValue.key==str_key) //--key相等
              {
                 //--更新 key value 
                 if(mykeyValue.value!=str_value)
                 {
                    keyValue=str_key+"="+value;
                    inidata[indx]=keyValue; 
                    is_exist=true;
                 }
                else
                {
                   is_exist=true;
                } 
              }
             
            }
        if(!is_exist){
             auto pos=inidata.begin()+startindx+1;
             inidata.insert(pos,keyValue); 
           }
  
        } 
        else //-文件无记录--
        {
           inidata.push_back(data);
           inidata.push_back(keyValue);
       
        }
       std::ofstream inifle(_iniFileName);//--写入ini
          if(!inifle.is_open()) {
           lastError="inifile creation failed !!"; 
           return false;
         }
       for(int i=0;i<inidata.size();i++){
          inifle<<inidata.at(i)<<std::endl;
         }
      inifle.close();
      return true;
}

const char *Linifile::readini(const char *root, const char *key)
{ //--读取ini 返回value
   //1、读取ini文件
        std::string str_root=root;
        std::string str_key=key;
        std::string data="["+str_root+"]";
        std::string value;
       getinidata(_iniFileName.c_str()); //获取ini全部内容,存入vector 返回记录数
       int indx=findRoot(data.c_str());//--找出root 并返回索引号0--->N;
        int startindx=indx;
      if(indx >-1) //--存在文件中   //--检查key value 是否存在。不存在就写入。
        {
           while(1)
           {
             indx=indx+1;
             if(indx>inidata.size()-1) break; //超出记录退出
             if(inidata.at(indx).substr(0,1)=="[")
             {
                break; //--本区间结束退出
             }  
              getKey(inidata.at(indx).c_str()); //获取key 和 value
              if(mykeyValue.key==str_key) //--key相等
              {
                value=mykeyValue.value;   //--找到value
                str_data=new char[value.length()+1];
                strcpy(str_data,value.c_str());
                return str_data;
                break;
              }
             
            }
             
         }

    return nullptr;
}

const char *Linifile::showLastError()
{
    return lastError.c_str();
}

int Linifile::getinidata(const char *file)
{
    // 将ini文件内容全部载入到vector中备用 返回当前ini记录条数
    std::ifstream inifle(file);
    std::string str;
    inidata.clear();//情况初始化
    while (std::getline(inifle,str))
    {
       inidata.push_back(str);
    }
    inifle.close();
   return inidata.size();
}
int Linifile::findRoot(const char *root)
{
   //--查找root 并返回 indx
   std::string Root=root;
   for (int i=0;i<inidata.size();i++){
       if(Root==inidata.at(i)){
        return i;
       }
   }
  return -1;
}

void Linifile::getKey(const char *keyvalue)
{
    std::string _keyvalue=keyvalue;
    std::string key,value;
    int idx=-1;
    for (int i=0;i<_keyvalue.size();i++){
        if(_keyvalue.substr(i,1)=="=")
        {
             idx=i;
             break;
        }
      }
       key=_keyvalue.substr(0,idx);
       value=_keyvalue.substr(idx+1,_keyvalue.size()-1);
       mykeyValue.key=key;
       mykeyValue.value=value;
  
}
